home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 January - Disc 2 / Macworld (1999-01) (Disk 2).dmg / Serious Demos / Symbolic Composer 4.2 / Environment / System / SYMBOL / Symbol Generators / Grammars / expand-grammar < prev    next >
Text File  |  1998-10-23  |  5KB  |  149 lines

  1. expand-grammar tree level
  2.  
  3. expand-grammar expands the tree on a given recursion level, returning those elements that have no further definitions. With combination of def-grammar this function ables to define song structures of any complexity level.
  4.  
  5. (def-grammar 'structure
  6.    fugue (intro variations coda) ; add cadenza
  7.    variations (part1 part2 part3 part4)
  8.    variations (part3 part2 part1 part4)
  9. )
  10.  
  11. You have many options on defining the grammars. In the above is shown the possibility to use non-deterministic grammars, which can expand in different ways.
  12.  
  13. (expand-grammar fugue 2 'structure)
  14. -->(intro part1 part2 part3 part4 coda)
  15.  
  16. (expand-grammar fugue 2 'structure)
  17. --> (intro part3 part2 part1 part4 coda)
  18.  
  19. The definitions can be any symbols, and the results are applicable to all compositional parameters, directly or with the aid of conversions functions. When defining the song structure, use expand-grammar in combination with realize-class to define instruments.
  20.  
  21. (realize-class :all
  22.    instr1 (expand-grammar fugue 2 'structure)
  23.    instr2 (expand-grammar fugue 2 'structure)
  24.    instr3 (expand-grammar fugue 2 'structure)
  25.    instr4 (expand-grammar fugue 2 'structure)
  26. )
  27.  
  28. Example
  29.  
  30. Let's make a grammar tree.
  31.  
  32. (def-grammar 'structure
  33.    fugue (intro variations coda)
  34.    variations (part1 part2 part3 part4)
  35. )
  36.  
  37. What does expand-grammar do? It walks through the given tree and returns the nodes that contain no further nodes. If you imagine an ordinary tree, then expand-grammar returns all the leaves. Using the above tree we get:
  38.  
  39. (expand-grammar fugue 2 'structure)
  40. --> (intro part1 part2 part3 part4 coda)
  41.  
  42. Notice how the variations node is expanded to part1 ... part4. Intro and code contain no further nodes, and are thus returned as is.
  43.  
  44. How is the level of expand-grammar controlled? Let's make a recursive grammar. Here variations consists of part1, part2, itself, part3 and part4. Looks tricky and not certainly stuff ordinary composers are using, but possible.
  45.  
  46. (def-grammar 'structure
  47.    fugue (intro variations coda)
  48.    variations (part1 part2 variations part3 part4)
  49. )
  50.  
  51. Now, what happens when this tree is expanded? Let's try it on the same level as in previous example.
  52.  
  53. (expand-grammar fugue 2 'structure)
  54. --> (intro part1 part2 part3 part4 coda)
  55.  
  56. We'll get the same output. On level 2 the variations is not expanded further. Let's try level 3.
  57.  
  58. (expand-grammar fugue 3 'structure)
  59. --> (intro part1 part2 part1 part2 part3 part4 part3 part4 coda)
  60.  
  61. ;    See how           ----------------------- is nested inside
  62. ;itself    ------------                       ------------
  63.  
  64. In further levels, more nesting will occur. Try analyzing the following output in a similar way.
  65.  
  66. (expand-grammar fugue 4 'structure)
  67. --> (intro part1 part2 part1 part2 part1 part2 part3 part4 part3 part4 part3 part4 coda)
  68.  
  69. How does expand-grammar relate to realize-class?
  70.  
  71. Realize-class makes instrument bindings. If you want to bind all class definitions of section a to instr1 you'll write it this way:
  72.  
  73. (realize-class :all
  74.    instr1 '(a)
  75. )
  76.  
  77. If you want to realize also other sections you can just extend the list of sections. Here you bind section a, section b, and again section a and b to instr1. When you now compile-instrument instr1 it will play sections a b a b.
  78.  
  79. (realize-class :all
  80.    instr1 '(a b a b)
  81. )
  82.  
  83. Since expand-grammar returns lists of sections, you can replace the manually written list in the above example
  84.  
  85. You can now realize the classes by expand-grammar function. It will now return the sections and realize-class will make the instrument bindings accordingly.
  86.  
  87. (realize-class :all
  88.    instr1 (expand-grammar fugue 2 'structure)
  89. )
  90.  
  91. So, actually the above makes this:
  92.  
  93. (realize-class :all
  94.    instr1 '(intro part1 part2 part3 part4 coda)
  95. )
  96.  
  97. And then you can play your instrument
  98.  
  99. (compile-instrument "ccl;output:" "my song"
  100.    instr1
  101. )
  102.  
  103. How does realize-class and expand-grammar relate to play-file?
  104.  
  105. Play-file does them automatically. Notice that def-orchestra makes similar tree grammars, but it is only used for inheritation, not expansion.
  106.  
  107. (def-orchestra 'orchestra
  108.    all-instruments (piano synth)
  109.    piano (left-hand right-hand)
  110. )
  111.  
  112. (def-grammar 'structure
  113.    fugue (intro variations coda)
  114.    variations (part1 part2 part3 part4)
  115. )
  116.  
  117. Then you play all-instruments in fugue section structure.
  118.  
  119. (play-file "my song"
  120.    all-instruments '(fugue)
  121. )
  122.  
  123. Using recursive section structures
  124.  
  125. If so, you cannot use play-file. You have to write the above example with realize-class and expand-grammar. Why? Play-file cannot handle recursion.
  126.  
  127. (def-orchestra 'orchestra
  128.    all-instruments (piano synth)
  129.    piano (left-hand right-hand)
  130. )
  131.  
  132. (def-grammar 'structure
  133.    fugue (intro variations coda)
  134.    variations (part1 part2 variations part3 part4)
  135. )
  136.  
  137. (realize-class :all
  138.    instr1 (expand-grammar fugue 4 'structure)
  139. )
  140.  
  141. (compile-instrument "ccl;output:" "my song"
  142.    instr1
  143. )
  144.  
  145. This ends up playing instr1 to midi file with section structure
  146.  
  147. (intro part1 part2 part1 part2 part1 part2 part3 part4 part3 part4 part3 part4 coda)
  148.  
  149. Important! Before you can use realize-class and expand-grammar you must define classes with def-class, def-section or def-section-timesheet.